#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/wait.h>

//int main()
//{
//    int fd[2] = {0};
//    if(pipe(fd) < 0){
//        perror("pipe");
//        return 1;
//    }
//
//    pid_t id = fork(); //使用fork创建子进程
//    if(id == 0)
//    {
//        close(fd[0]);//子进程关闭读端
//        //子进程向管道写入数据
//        const char* msg = "hello father, I am child...";
//        int count = 10;
//        while(count--)
//        {
//            write(fd[1], msg, strlen(msg));
//            sleep(1);
//        }
//        close(fd[1]);//子进程写入完毕，关闭写端
//        exit(0);
//    }
//    // father
//    close(fd[1]);//父进程关闭写端
//    //close(fd[0]); //父进程直接关闭读端（导致子进程被操作系统杀掉）
//    int status = 0;
//    waitpid(id, &status, 0);
//    printf("child get signal:%d\n", status & 0x7F);
//    return 0;
//}
//

#include<signal.h>

//void printPending(sigset_t* pending)
//{
//    int i = 1;
//    for(i=1; i<=31; i++)
//    {
//        if(sigismember(pending, i))
//        {
//            printf("1 ");
//        }
//        else 
//        {
//            printf("0 ");
//        }
//    }
//    printf("\n");
//}
//
//int main()
//{
//    sigset_t set, oset;
//    sigemptyset(&set);
//    sigemptyset(&oset);
//
//    sigaddset(&set, 2);
//    sigprocmask(SIG_SETMASK, &set, &oset); //阻塞二号信号
//
//    sigset_t pending;
//    sigemptyset(&pending);
//
//    int count = 0;
//    while(1)
//    {
//        sigpending(&pending); // 获取pending
//        printPending(&pending); //打印pending位图（1表示未决）
//        sleep(1);
//        count++;
//        if(count == 20)
//        {
//            sigprocmask(SIG_SETMASK, &oset, NULL);//恢复曾经的信号屏蔽字
//            printf("恢复信号屏蔽字\n");
//        }
//    }
//    return 0;
//}
//
//

void handler(int signo)
{
    printf("get a signal: %d\n", signo);
    int ret = 0;
    while((ret = waitpid(-1, NULL, WNOHANG)) > 0)
    {
        printf("wait child %d success\n", ret);
    }
}

int main()
{
    signal(SIGCHLD, handler);
    if(fork() == 0)
    {
        printf("child is running, begin dead: %d\n", getpid());
        sleep(3);
        exit(1);
    }

    while(1);
    return 0;
}
